Skip to content

feat: Implement BaseDataService#8039

Draft
FrederikBolding wants to merge 21 commits intomainfrom
fb/data-service-base
Draft

feat: Implement BaseDataService#8039
FrederikBolding wants to merge 21 commits intomainfrom
fb/data-service-base

Conversation

@FrederikBolding
Copy link
Member

@FrederikBolding FrederikBolding commented Feb 25, 2026

Explanation

This PR implements BaseDataService and a function to wrap QueryClient to proxy requests accordingly.

The BaseDataService, similarly to the BaseController provides the framework for building a service that can be registered and accessed via the messenger system, but also provides guarantees about per-request deduping, retries, caching, invalidation, state-while-revalidate etc via @tanstack/query-core.

The BaseDataService provides two utilities for this: fetchQuery and fetchInfiniteQuery, which is similar but one is separated for special pagination behaviour. Each service has its own cache for the APIs that it exposes that must also be synchronized with the UI processes. To facilitate this synchronization, the BaseDataService also automatically provides subscribe, unsubscribe and invalidateQueries actions as well as a cacheUpdate event.

The overall goal of the PR is to provide a base layer that can keep as much compatibility as possible with native TanStack Query while also simultaneously allowing us to have one source of truth per data service.

The synchronization is achieved via a special QueryClient created by createUIQueryClient, which wraps functionality such as cache invalidation, provides the default proxied fetch behaviour and subscribes to cache updates from data services that it is observing (e.g. has active queries for).

References

https://consensyssoftware.atlassian.net/browse/WPC-445

Checklist

  • I've updated the test suite for new or updated code as appropriate
  • I've updated documentation (JSDoc, Markdown, etc.) for new or updated code as appropriate
  • I've communicated my changes to consumers by updating changelogs for packages I've changed
  • I've introduced breaking changes in this PR and have prepared draft pull requests for clients and consumer packages to resolve them

@socket-security
Copy link

socket-security bot commented Feb 25, 2026

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Added@​tanstack/​query-core@​4.43.0981007698100

View full report

Base automatically changed from fb/init-base-data-service to main February 25, 2026 15:39
@FrederikBolding FrederikBolding force-pushed the fb/data-service-base branch 2 times, most recently from f4f9488 to 5b5e148 Compare February 26, 2026 09:15
@FrederikBolding
Copy link
Member Author

@metamaskbot publish-previews

@github-actions
Copy link
Contributor

Preview builds have been published. See these instructions for more information about preview builds.

Expand for full list of packages and versions.
{
  "@metamask-previews/account-tree-controller": "4.1.1-preview-ee1fa5d01",
  "@metamask-previews/accounts-controller": "36.0.1-preview-ee1fa5d01",
  "@metamask-previews/address-book-controller": "7.0.1-preview-ee1fa5d01",
  "@metamask-previews/ai-controllers": "0.1.0-preview-ee1fa5d01",
  "@metamask-previews/analytics-controller": "1.0.0-preview-ee1fa5d01",
  "@metamask-previews/analytics-data-regulation-controller": "0.0.0-preview-ee1fa5d01",
  "@metamask-previews/announcement-controller": "8.0.0-preview-ee1fa5d01",
  "@metamask-previews/app-metadata-controller": "2.0.0-preview-ee1fa5d01",
  "@metamask-previews/approval-controller": "8.0.0-preview-ee1fa5d01",
  "@metamask-previews/assets-controller": "2.1.0-preview-ee1fa5d01",
  "@metamask-previews/assets-controllers": "100.0.3-preview-ee1fa5d01",
  "@metamask-previews/base-controller": "9.0.0-preview-ee1fa5d01",
  "@metamask-previews/base-data-service": "0.0.0-preview-ee1fa5d01",
  "@metamask-previews/bridge-controller": "67.3.0-preview-ee1fa5d01",
  "@metamask-previews/bridge-status-controller": "67.0.1-preview-ee1fa5d01",
  "@metamask-previews/build-utils": "3.0.4-preview-ee1fa5d01",
  "@metamask-previews/chain-agnostic-permission": "1.4.0-preview-ee1fa5d01",
  "@metamask-previews/claims-controller": "0.4.2-preview-ee1fa5d01",
  "@metamask-previews/client-controller": "1.0.0-preview-ee1fa5d01",
  "@metamask-previews/compliance-controller": "1.0.1-preview-ee1fa5d01",
  "@metamask-previews/composable-controller": "12.0.0-preview-ee1fa5d01",
  "@metamask-previews/connectivity-controller": "0.1.0-preview-ee1fa5d01",
  "@metamask-previews/controller-utils": "11.19.0-preview-ee1fa5d01",
  "@metamask-previews/core-backend": "6.0.0-preview-ee1fa5d01",
  "@metamask-previews/delegation-controller": "2.0.1-preview-ee1fa5d01",
  "@metamask-previews/earn-controller": "11.1.1-preview-ee1fa5d01",
  "@metamask-previews/eip-5792-middleware": "2.1.0-preview-ee1fa5d01",
  "@metamask-previews/eip-7702-internal-rpc-middleware": "0.1.0-preview-ee1fa5d01",
  "@metamask-previews/eip1193-permission-middleware": "1.0.3-preview-ee1fa5d01",
  "@metamask-previews/ens-controller": "19.0.3-preview-ee1fa5d01",
  "@metamask-previews/error-reporting-service": "3.0.1-preview-ee1fa5d01",
  "@metamask-previews/eth-block-tracker": "15.0.1-preview-ee1fa5d01",
  "@metamask-previews/eth-json-rpc-middleware": "23.1.0-preview-ee1fa5d01",
  "@metamask-previews/eth-json-rpc-provider": "6.0.0-preview-ee1fa5d01",
  "@metamask-previews/foundryup": "1.0.1-preview-ee1fa5d01",
  "@metamask-previews/gas-fee-controller": "26.0.3-preview-ee1fa5d01",
  "@metamask-previews/gator-permissions-controller": "2.0.0-preview-ee1fa5d01",
  "@metamask-previews/json-rpc-engine": "10.2.2-preview-ee1fa5d01",
  "@metamask-previews/json-rpc-middleware-stream": "8.0.8-preview-ee1fa5d01",
  "@metamask-previews/keyring-controller": "25.1.0-preview-ee1fa5d01",
  "@metamask-previews/logging-controller": "7.0.1-preview-ee1fa5d01",
  "@metamask-previews/message-manager": "14.1.0-preview-ee1fa5d01",
  "@metamask-previews/messenger": "0.3.0-preview-ee1fa5d01",
  "@metamask-previews/multichain-account-service": "7.0.0-preview-ee1fa5d01",
  "@metamask-previews/multichain-api-middleware": "1.2.7-preview-ee1fa5d01",
  "@metamask-previews/multichain-network-controller": "3.0.4-preview-ee1fa5d01",
  "@metamask-previews/multichain-transactions-controller": "7.0.1-preview-ee1fa5d01",
  "@metamask-previews/name-controller": "9.0.0-preview-ee1fa5d01",
  "@metamask-previews/network-controller": "30.0.0-preview-ee1fa5d01",
  "@metamask-previews/network-enablement-controller": "4.1.2-preview-ee1fa5d01",
  "@metamask-previews/notification-services-controller": "22.0.0-preview-ee1fa5d01",
  "@metamask-previews/permission-controller": "12.2.0-preview-ee1fa5d01",
  "@metamask-previews/permission-log-controller": "5.0.0-preview-ee1fa5d01",
  "@metamask-previews/perps-controller": "0.0.0-preview-ee1fa5d01",
  "@metamask-previews/phishing-controller": "16.3.0-preview-ee1fa5d01",
  "@metamask-previews/polling-controller": "16.0.3-preview-ee1fa5d01",
  "@metamask-previews/preferences-controller": "22.1.0-preview-ee1fa5d01",
  "@metamask-previews/profile-metrics-controller": "3.0.1-preview-ee1fa5d01",
  "@metamask-previews/profile-sync-controller": "27.1.0-preview-ee1fa5d01",
  "@metamask-previews/ramps-controller": "10.0.0-preview-ee1fa5d01",
  "@metamask-previews/rate-limit-controller": "7.0.0-preview-ee1fa5d01",
  "@metamask-previews/remote-feature-flag-controller": "4.1.0-preview-ee1fa5d01",
  "@metamask-previews/sample-controllers": "4.0.3-preview-ee1fa5d01",
  "@metamask-previews/seedless-onboarding-controller": "8.1.0-preview-ee1fa5d01",
  "@metamask-previews/selected-network-controller": "26.0.3-preview-ee1fa5d01",
  "@metamask-previews/shield-controller": "5.0.1-preview-ee1fa5d01",
  "@metamask-previews/signature-controller": "39.0.4-preview-ee1fa5d01",
  "@metamask-previews/storage-service": "1.0.0-preview-ee1fa5d01",
  "@metamask-previews/subscription-controller": "6.0.0-preview-ee1fa5d01",
  "@metamask-previews/transaction-controller": "62.19.0-preview-ee1fa5d01",
  "@metamask-previews/transaction-pay-controller": "16.1.0-preview-ee1fa5d01",
  "@metamask-previews/user-operation-controller": "41.0.3-preview-ee1fa5d01"
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant